#include "bib_Hilos.h"

int crearHilo(void *parametro, unsigned (__stdcall *funcion) (void *), HANDLE *hilo){

	if (!(*hilo = (HANDLE) _beginthreadex(NULL, TAM_STACK, funcion, parametro, 0, NULL))){
		imprimirLog(WARNING, "No se pudo crear el hilo de conexion", strerror(errno));
		return EXIT_FAILURE;
	}
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int liberarHandle(HANDLE handle){

	char nroError[TAM_ERROR + 1];

	if (!CloseHandle(handle)){
		sprintf(nroError, "%d", GetLastError());
		imprimirLog(WARNING, "No se pudo liberar el handle", nroError);
		return EXIT_FAILURE;
	}
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int crearMutex(HANDLE *mutex, BOOL tomarControl){

	char nroError[TAM_ERROR + 1];

	if ((*mutex = CreateMutex(NULL, tomarControl, NULL)) == NULL){
		sprintf(nroError, "%d", GetLastError());
		imprimirLog(WARNING, "No se pudo crear el mutex", nroError);
		return EXIT_FAILURE;
	}
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int tomarControlMutex(HANDLE mutex){

	char nroError[TAM_ERROR + 1];
	DWORD resultado;

	if ((resultado = WaitForSingleObject(mutex, INFINITE)) == WAIT_FAILED){
		sprintf(nroError, "%d", GetLastError());
		imprimirLog(WARNING, "No se pudo tomar control del Mutex", nroError);
		return EXIT_FAILURE;
	}
	
	else if(resultado == WAIT_ABANDONED){
		imprimirLog(WARNING, "El hilo propietario del mutex acabo sin devolver el control","");
		return EXIT_FAILURE;
	}
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int liberarControlMutex(HANDLE mutex){

	char nroError[TAM_ERROR + 1];

	if (!ReleaseMutex(mutex)){
		sprintf(nroError, "%d", GetLastError());
		imprimirLog(WARNING, "No se pudo liberar el control del mutex", nroError);
		return EXIT_FAILURE;
	}
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int esperarFinHilo(HANDLE hilo){

	char nroError[TAM_ERROR + 1];

	if (WaitForSingleObject(hilo, INFINITE) == WAIT_FAILED){
		sprintf(nroError, "%d", GetLastError());
		imprimirLog(ERROR, "No se pudo obtener el control del hilo", nroError);
		return EXIT_FAILURE;
	}
	
	return EXIT_SUCCESS;
}